/**
 * Project Name:javaDemo
 * File Name:Arithmetic.java
 * Package Name:com.yixun.demo
 * Date:2017年6月16日下午2:21:06
 * Copyright (c) 2017, test@qq.com All Rights Reserved.
 *
 */

package com.emm.yixun.website.utils;

/**
 * ClassName:Arithmetic <br/>
 * Date: 2017年6月16日 下午2:21:06 <br/>
 * 
 * @author Administrator
 * @version
 * @since JDK 1.6
 * @see
 */
import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
public class Arithmetic {

    static Key key;

    public static void getKey(String strKey) {
	try {
	    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
	    random.setSeed(strKey.getBytes());
	    KeyGenerator _generator = KeyGenerator.getInstance("DES");
	    _generator.init(random);
	    key = _generator.generateKey();
	    _generator = null;
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public static String getEncString(String strMing) {
	byte[] byteMi = null;
	byte[] byteMing = null;
	String strMi = "";
	try {
	    return byte2hex(getEncCode(strMing.getBytes()));

	    // byteMing = strMing.getBytes("UTF8");
	    // byteMi = this.getEncCode(byteMing);
	    // strMi = new String( byteMi,"UTF8");
	} catch (Exception e) {
	    e.printStackTrace();
	} finally {
	    byteMing = null;
	    byteMi = null;
	}
	return strMi;
    }

    public static String getDesString(String strMi) {
	byte[] byteMing = null;
	byte[] byteMi = null;
	String strMing = "";
	try {
	    return new String(getDesCode(hex2byte(strMi.getBytes())));

	    // byteMing = this.getDesCode(byteMi);
	    // strMing = new String(byteMing,"UTF8");
	} catch (Exception e) {
	    e.printStackTrace();
	} finally {
	    byteMing = null;
	    byteMi = null;
	}
	return strMing;
    }

    private static byte[] getEncCode(byte[] byteS) {
	byte[] byteFina = null;
	Cipher cipher;
	try {
	    cipher = Cipher.getInstance("DES");
	    cipher.init(Cipher.ENCRYPT_MODE, key);
	    byteFina = cipher.doFinal(byteS);
	} catch (Exception e) {
	    e.printStackTrace();
	} finally {
	    cipher = null;
	}
	return byteFina;
    }

    private static byte[] getDesCode(byte[] byteD) {
	Cipher cipher;
	byte[] byteFina = null;
	try {
	    cipher = Cipher.getInstance("DES");
	    cipher.init(Cipher.DECRYPT_MODE, key);
	    byteFina = cipher.doFinal(byteD);
	} catch (Exception e) {
	    e.printStackTrace();
	} finally {
	    cipher = null;
	}
	return byteFina;
    }

    public static String byte2hex(byte[] b) { // 一个字节的数，
	// 转成16进制字符串
	String hs = "";
	String stmp = "";
	for (int n = 0; n < b.length; n++) {
	    // 整数转成十六进制表示
	    stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
	    if (stmp.length() == 1)
		hs = hs + "0" + stmp;
	    else
		hs = hs + stmp;
	}
	return hs.toUpperCase(); // 转成大写
    }

    public static byte[] hex2byte(byte[] b) {
	if ((b.length % 2) != 0)
	    throw new IllegalArgumentException("长度不是偶数");
	byte[] b2 = new byte[b.length / 2];
	for (int n = 0; n < b.length; n += 2) {
	    String item = new String(b, n, 2);
	    // 两位一组，表示一个字节,把这样表示的16进制字符串，还原成一个进制字节
	    b2[n / 2] = (byte) Integer.parseInt(item, 16);
	}

	return b2;
    }
    public static void main(String[] args) {
	  Arithmetic.getKey("userName");// 生成密匙

	  String strEnc = Arithmetic.getEncString("17715291812");// 加密字符串,返回String的密文
	  System.out.println(strEnc);

	  String strDes = Arithmetic.getDesString(strEnc);// 把String 类型的密文解密
	  System.out.println(strDes);
	 }
}
